package cn.tedu.micro.demo.rabbitmq.amqp;

import cn.tedu.micro.demo.rabbitmq.pojo.MyMessage;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 整合完毕 这个对象的消费方法 业务方法会
 * 在底层被handle调用
 */
@Component
@Slf4j
public class DemoConsumer {
    //监听队列 接收参数 是底层handle传递过来 MessageDelivery 消息体 消息头
    /*@RabbitListener(queues = "demo_queue")
    public void consume01(String json){
        //{"msg":"你好"}
        MyMessage message = ProducerClient.deserializer(json, MyMessage.class);
        log.info("接收 消费消息:{}",message);
    }*/
    //监听更多的队列
    /*@RabbitListener(queues = "demo_queue")
    public void consume02(Message message){
        //底层handle方法 将Message转化成一个消费方法入参,相比于消息体String/
        //完整消息多了属性 头 路由来源
        byte[] body = message.getBody();
        MyMessage myMessage = ProducerClient.deserializer(body, MyMessage.class);
        MessageProperties properties = message.getMessageProperties();
        //userId appId messageId
    }*/
   /* @RabbitListener(queues = "demo_queue")
    public void consume03(Channel channel){
        //可以利用这个channel处理rabbitmq的消费结果 决绝消息 消费成功
        log.info("拿到底层连接:{}",channel);
    }*/
    @RabbitListener(queues = "demo_queue")
    public void consume04(String json, Message message, Channel channel){
        //接收消息体反序列化的json字符串
        //接收底层完整对象 包含消息体body byte[]
        //接收监听连接对象
        //组合入参中,可以实现 消息消费,同时可以根据消费方法执行结果 判断
        //消费的结果是拒绝 重新投递 还是消费成功 确认
        MyMessage msg = ProducerClient.deserializer(json, MyMessage.class);
        log.info("消费接收:{}",msg);
        //手动确认 必须关闭自动确认
        try{
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e){
            log.error("消息消费异常");
        }
    }
}
